/**
 * MScaleAnimation.java
 * classes: com.hymobile.common.animation.MScaleAnimation
 * 梁天刚 created at 2011-12-8 下午2:52:44
 */
package com.wzz.common.animation;

import android.view.animation.Transformation;


/**
 * com.hymobile.common.animation.MScaleAnimation
 * @author 梁天刚
 *
 * created at 2011-12-8 下午2:52:44
 */
public class MScaleAnimation extends MAnimation {
  
  private float mFromX;
  private float mToX;
  private float mFromY;
  private float mToY;

  private int mPivotXType = ABSOLUTE;
  private int mPivotYType = ABSOLUTE;
  private float mPivotXValue = 0.0f;
  private float mPivotYValue = 0.0f;

  private float mPivotX;
  private float mPivotY;
  

  /**
   * Constructor to use when building a ScaleAnimation from code
   * 
   * @param fromX Horizontal scaling factor to apply at the start of the
   *        animation
   * @param toX Horizontal scaling factor to apply at the end of the animation
   * @param fromY Vertical scaling factor to apply at the start of the
   *        animation
   * @param toY Vertical scaling factor to apply at the end of the animation
   */
  public MScaleAnimation(float fromX, float toX, float fromY, float toY) {
      mFromX = fromX;
      mToX = toX;
      mFromY = fromY;
      mToY = toY;
      mPivotX = 0;
      mPivotY = 0;
  }

  /**
   * Constructor to use when building a ScaleAnimation from code
   * 
   * @param fromX Horizontal scaling factor to apply at the start of the
   *        animation
   * @param toX Horizontal scaling factor to apply at the end of the animation
   * @param fromY Vertical scaling factor to apply at the start of the
   *        animation
   * @param toY Vertical scaling factor to apply at the end of the animation
   * @param pivotX The X coordinate of the point about which the object is
   *        being scaled, specified as an absolute number where 0 is the left
   *        edge. (This point remains fixed while the object changes size.)
   * @param pivotY The Y coordinate of the point about which the object is
   *        being scaled, specified as an absolute number where 0 is the top
   *        edge. (This point remains fixed while the object changes size.)
   */
  public MScaleAnimation(float fromX, float toX, float fromY, float toY,
          float pivotX, float pivotY) {
      mFromX = fromX;
      mToX = toX;
      mFromY = fromY;
      mToY = toY;

      mPivotXType = ABSOLUTE;
      mPivotYType = ABSOLUTE;
      mPivotXValue = pivotX;
      mPivotYValue = pivotY;
  }

  /**
   * Constructor to use when building a ScaleAnimation from code
   * 
   * @param fromX Horizontal scaling factor to apply at the start of the
   *        animation
   * @param toX Horizontal scaling factor to apply at the end of the animation
   * @param fromY Vertical scaling factor to apply at the start of the
   *        animation
   * @param toY Vertical scaling factor to apply at the end of the animation
   * @param pivotXType Specifies how pivotXValue should be interpreted. One of
   *        Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
   *        Animation.RELATIVE_TO_PARENT.
   * @param pivotXValue The X coordinate of the point about which the object
   *        is being scaled, specified as an absolute number where 0 is the
   *        left edge. (This point remains fixed while the object changes
   *        size.) This value can either be an absolute number if pivotXType
   *        is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
   * @param pivotYType Specifies how pivotYValue should be interpreted. One of
   *        Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
   *        Animation.RELATIVE_TO_PARENT.
   * @param pivotYValue The Y coordinate of the point about which the object
   *        is being scaled, specified as an absolute number where 0 is the
   *        top edge. (This point remains fixed while the object changes
   *        size.) This value can either be an absolute number if pivotYType
   *        is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
   */
  public MScaleAnimation(float fromX, float toX, float fromY, float toY,
          int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {
      mFromX = fromX;
      mToX = toX;
      mFromY = fromY;
      mToY = toY;

      mPivotXValue = pivotXValue;
      mPivotXType = pivotXType;
      mPivotYValue = pivotYValue;
      mPivotYType = pivotYType;
  }

  @Override
  protected void applyTransformation(float interpolatedTime, Transformation t) {
      float sx = 1.0f;
      float sy = 1.0f;

      if (mFromX != 1.0f || mToX != 1.0f) {
          sx = mFromX + ((mToX - mFromX) * interpolatedTime);
      }
      if (mFromY != 1.0f || mToY != 1.0f) {
          sy = mFromY + ((mToY - mFromY) * interpolatedTime);
      }

      if (mPivotX == 0 && mPivotY == 0) {
          t.getMatrix().setScale(sx, sy);
      } else {
          t.getMatrix().setScale(sx, sy, mPivotX, mPivotY);
      }
  }

  @Override
  public void initialize(int width, int height, int parentWidth, int parentHeight) {
      super.initialize(width, height, parentWidth, parentHeight);

      mPivotX = resolveXSize(mPivotXType, mPivotXValue, width, parentWidth);
      mPivotY = resolveYSize(mPivotYType, mPivotYValue, height, parentHeight);
  }

}
